﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.UI.WebControls;
using MIAP.Entidades;
using MIAP.Entidades.Enums;
using MIAP.Negocio;
using MIAPWEB.Common;

namespace MIAPWEB.Forms
{
    public partial class AdministraArchivo : PageBase
    {
        #region Constantes

        /// <summary>
        /// Clase de negocio de las operaciones de archivos.
        /// </summary>
        private AdministrarArchivosNegocio archivoNegocio;

        /// <summary>
        /// Clase de negocio para las operaciones comunes del sistema.
        /// </summary>
        private ComunesNegocio comunesNegocio;

        #endregion

        #region Propiedades

        /// <summary>
        /// Id del proyecto 
        /// </summary>
        private int? IdArchivo
        {
            get
            {
                if (this.ViewState[AppQueryStrings.IdArchivo] == null)
                {
                    this.ViewState[AppQueryStrings.IdArchivo] = "0";
                }

                return Convert.ToInt32(this.ViewState[AppQueryStrings.IdArchivo]);
            }

            set { this.ViewState[AppQueryStrings.IdArchivo] = value; }
        }

        /// <summary>
        /// registros busqueda archivos
        /// </summary>
        private List<ArchivoInfo> DataSourceArchivos
        {
            get
            {
                return this.ViewState["DataSourceArchivos"] as List<ArchivoInfo>;
            }

            set
            {
                this.ViewState["DataSourceArchivos"] = value;
            }
        }

        /// <summary>
        /// registros busqueda archivos
        /// </summary>
        private List<UsuarioInfo> DataSourceUsuarios
        {
            get
            {
                return this.ViewState["DataSourceUsuarios"] as List<UsuarioInfo>;
            }

            set
            {
                this.ViewState["DataSourceUsuarios"] = value;
            }
        }

        #endregion

        #region Eventos

        /// <summary>
        /// Evento que se ejecuta al cargar la página.
        /// </summary>
        /// <param name="sender">Objeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            int pageSize = Convert.ToInt32(new ConfiguracionNegocio().GetNumeroPaginasGrid().Descripcion);
            this.grdArchivos.PageSize = pageSize;
            this.grdUsuarios.PageSize = pageSize;
            if (!this.IsPostBack)
            {
                this.LoadinitialCatalogs();
                this.AppendDefaultDropDownItem();
                this.Search();

                var permiso = AppSessionManager.Instance.Permisos.Where(p => p.Url == AppUrls.AltaArchivos).SingleOrDefault();

                if (permiso == null)
                {
                    this.btnNuevo.Enabled = false;
                }
            }            
        }

        protected void btnBuscar_Click(object sender, EventArgs e)
        {
            this.Search();
        }

        /// <summary>
        /// realiza la busqueda de archivos
        /// </summary>
        private void Search()
        {
            var nombre = String.IsNullOrEmpty(this.txtNombre.Text) ? null : this.txtNombre.Text;
            var idproyecto = this.ddlProyecto.SelectedValue == this.comunesNegocio.ValorTodos ? (int?)null : Convert.ToInt32(ddlProyecto.SelectedValue);
            var idFromatoArchivo = this.ddlFormatoArchivo.SelectedValue == this.comunesNegocio.ValorTodos ? (int?)null : Convert.ToInt32(ddlFormatoArchivo.SelectedValue);
            var esObliatorio = this.ddlObligatorio.SelectedValue == this.comunesNegocio.ValorTodos ? (bool?)null : Convert.ToInt32(ddlObligatorio.SelectedValue) == (int)SiNo.Si;
            var esVersion = this.ddlVersion.SelectedValue == this.comunesNegocio.ValorTodos ? (bool?)null : Convert.ToInt32(ddlVersion.SelectedValue) == (int)SiNo.Si;
            var estaActivo = this.ddlEstatus.SelectedValue == this.comunesNegocio.ValorTodos ? (bool?)null : Convert.ToInt32(ddlEstatus.SelectedValue)==(int)Estatus.Activo;

            var listaArchivos = this.archivoNegocio.GetArchivos(nombre, idproyecto, idFromatoArchivo, esObliatorio, esVersion,
                                                                estaActivo);
            if (idproyecto == null)
            {
                var loproyectos = AppSessionManager.Instance.GetProyectosByPagina(AppUrls.AdministrarArchivos);
                var ids = (from proyecto in loproyectos select proyecto.IDProyecto).ToList();
                listaArchivos = this.comunesNegocio.FiltrarArchivosProyecto(listaArchivos, ids);
            }
            LlenaGridArchivos(listaArchivos);
            this.CleanSeleccion();
        }

        /// <summary>
        /// Llena el grid de los archivos
        /// </summary>
        /// <param name="archivos">archivos a insertar en el grid</param>
        private void LlenaGridArchivos(List<ArchivoInfo> archivos)
        {
            this.DataSourceArchivos = archivos;
            grdArchivos.DataSource = this.DataSourceArchivos;
            grdArchivos.DataBind();
        }

        protected void grdArchivos_SelectedIndexChanged(object sender, EventArgs e)
        {
            var dataKey = grdArchivos.DataKeys[((GridView)sender).SelectedIndex];
            if (dataKey == null) return;
            var colsNoVisible = dataKey.Values;
            this.IdArchivo = Convert.ToInt32(colsNoVisible[0]);
            this.LoadUsuarios(this.IdArchivo.Value);
        }

        protected void btnNuevo_Click(object sender, EventArgs e)
        {
            this.Response.Redirect(AppUrls.AltaArchivos);
            this.CleanSeleccion();
        }

        protected void btnModificar_Click(object sender, EventArgs e)
        {
            if (!this.IdArchivo.HasValue || this.IdArchivo == 0)
            {
                this.ShowMessage(this.GetGlobalResourceObject("Strings", "ErrorSeleccionar").ToString());
                return;
            }
            this.Response.Redirect(string.Format("{0}?{1}={2}", AppUrls.AltaArchivos, AppQueryStrings.IdArchivo, this.IdArchivo));
            this.CleanSeleccion();

        }

        /// <summary>
        /// muesrea los usuarios que pueden realizar cargas del archivo
        /// </summary>
        /// <param name="idArchivo"></param>
        private void LoadUsuarios( int idArchivo)
        {
            List<UsuarioInfo> source = null;
            if(idArchivo>0)
            {
                source = this.archivoNegocio.GetUsuariosCargan(idArchivo);
            }
            this.DataSourceUsuarios = source ;
            this.grdUsuarios.DataSource = this.DataSourceUsuarios;
            this.grdUsuarios.DataBind();

        }

        /// <summary>
        /// limpia la seleccion actual
        /// </summary>
        private void CleanSeleccion()
        {
            this.IdArchivo = null;
            this.grdArchivos.SelectedIndex = -1;
            this.LoadUsuarios(0);
        }

        protected void btnEliminar_Click(object sender, EventArgs e)
        {
            if (!this.IdArchivo.HasValue || this.IdArchivo == 0)
            {
                this.ShowMessage(this.GetGlobalResourceObject("Strings", "ErrorSeleccionar").ToString());
                return;
            }
            this.archivoNegocio.ChangeEstatusArchivo(this.IdArchivo.Value, false);
            this.CleanSeleccion();
            this.Search();
        }

        protected void btnSalir_Click(object sender, EventArgs e)
        {
            Response.Redirect(AppUrls.Default);
        }
        #endregion

        #region Métodos

        /// <summary>
        /// llena los dropdowns de la pagina
        /// </summary>
        private void LoadinitialCatalogs()
        {
            var listaSiNo = this.comunesNegocio.GetSiNo();
            this.ddlProyecto.DataSource = AppSessionManager.Instance.GetProyectosByPagina(AppUrls.AdministrarArchivos);
            this.ddlProyecto.DataBind();
            this.ddlFormatoArchivo.DataSource = this.archivoNegocio.GetFormatosArchivo();
            this.ddlFormatoArchivo.DataBind();
            this.ddlEstatus.DataSource = this.comunesNegocio.GetEstatus();
            this.ddlEstatus.DataBind();
            this.ddlObligatorio.DataSource = listaSiNo;
            this.ddlObligatorio.DataBind();
            this.ddlVersion.DataSource = listaSiNo;
            this.ddlVersion.DataBind();
        }

        /// <summary>
        /// Agrega al inicio del drop down el item por default
        /// </summary>
        private void AppendDefaultDropDownItem()
        {
            var mensajeTodos = this.GetGlobalResourceObject("strings", "Todos").ToString();
            this.comunesNegocio.SetTodos(mensajeTodos, this.ddlFormatoArchivo);
            this.comunesNegocio.SetTodos(mensajeTodos, this.ddlEstatus);
            this.comunesNegocio.SetTodos(mensajeTodos, this.ddlObligatorio);
            this.comunesNegocio.SetTodos(mensajeTodos, this.ddlVersion);
            this.comunesNegocio.SetTodos(mensajeTodos, this.ddlProyecto);
        }

        /// <summary>
        /// Constructor basico de la clase
        /// </summary>
        public AdministraArchivo()
        {
            this.archivoNegocio = new AdministrarArchivosNegocio();
            this.comunesNegocio = new ComunesNegocio();
        }

        #endregion

        protected void grdArchivos_OnSelectedIndexChanging(object sender, GridViewPageEventArgs e)
        {
            grdArchivos.PageIndex = e.NewPageIndex;
            this.grdArchivos.DataSource = this.DataSourceArchivos;
            this.grdArchivos.DataBind();
        }

        protected void grdUsuarios_OnSelectedIndexChanging(object sender, GridViewPageEventArgs e)
        {
            grdUsuarios.PageIndex = e.NewPageIndex;
            this.grdUsuarios.DataSource = this.DataSourceUsuarios;
            this.grdUsuarios.DataBind();
        }
    }
}